package com.peycash.util;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.peycash.common.dto.ClienteDTO;
import com.peycash.fachada.ClienteOpFachada;
import com.peycash.fachada.FachadaException;
import com.peycash.vista.RegistroObserver;

public class ClienteUtils implements Serializable {
	
	private final Logger LOGGER = LoggerFactory.getLogger(ClienteUtils.class);
	private static ClienteUtils instace = new ClienteUtils();
	private List<RegistroObserver> listaObservers;
	private Set<String> clientesLlamando;
	private List<ClienteDTO> listaClientes;
	private boolean appCorriendo;
	
	private ClienteUtils(){
		listaObservers = new ArrayList<RegistroObserver>();
		clientesLlamando = new HashSet<String>();
	}
	
	public synchronized boolean llamarCliente(String noCel){
		boolean b = clientesLlamando.add(noCel);
		if(b){
			for(RegistroObserver o : listaObservers){
				o.clienteOcupado(noCel);
			}			
		}
		return b;
	}
	
	public void terminaLlamada(String noCel){
		clientesLlamando.remove(noCel);
		for(RegistroObserver o : listaObservers){
			o.terminaLlamada(noCel);
		}
	}
	
	public void removeCliente(String noCel){
		clientesLlamando.remove(noCel);
		for(RegistroObserver o : listaObservers){
			o.removeCliente(noCel);
		}
	}
	
	public boolean isDisponible(String noCel){
		return !clientesLlamando.contains(noCel);
	}
	
	
	public void registrar(RegistroObserver observer){
		listaObservers.add(observer);
	}
	
	public void bajaRegistro(RegistroObserver observer){
		try{
			listaObservers.remove(observer);
		}catch(Exception e){
			LOGGER.error("Error en bajaRegistro:"+e.getMessage(), e);
		}
	}
	
	public void agregaMensaje(String msg){
		for(RegistroObserver o: listaObservers){
			o.update(msg);
		}
	}

	/**
	 * @return the instace
	 */
	public static ClienteUtils getInstace() {
		return instace;
	}

	public void setClienteEnLista(ClienteDTO dto, int index){
		listaClientes.set(index, dto);
	}
	
	public void removeClienteFromLista(ClienteDTO dto){
		listaClientes.remove(dto);
	}
	
	public void removeClienteFromLista(int index){
		listaClientes.remove(index);
	}
	
	public void addCliente(ClienteDTO dto){
		listaClientes.add(dto);
	}
	
	/**
	 * @return the listaClientes
	 */
	public List<ClienteDTO> getListaClientes() {
		if(appCorriendo){
			return listaClientes;
		}else{
			try {
				listaClientes = SpringUtils.getClienteFachada().findClientesPendientes();
				appCorriendo = true;
			} catch (FachadaException e) {
				listaClientes = new ArrayList<ClienteDTO>();
				LOGGER.error("Error en getListaClientes:"+e.getMessage(), e);
			}
			return listaClientes;
		}
		
	}

}
